跳转至

异常处理

类结构关系

java.lang.Object > java.lang.Throwable > java.lang.Exception = java.lang.Error = java.lang.VirtualMachineError

java.lang 这个包里面的东西,不需要 import 就可以使用。

try - catch - finally

详细的解答,参考 https://www.geeksforgeeks.org/flow-control-in-try-catch-finally-in-java/

概括来说,无论 try 当中的异常有没有被 catch 处理,finally 总是会执行

当不知道要捕捉的异常的具体类型,可以写 catch (Exception e) {};但这种应该放在所有已知类型捕捉的后面

throws

比如下面这种写法(在方法的后面加上 throw 异常名),就会把这个异常扔给调用者去处理

特别的,main() 的调用者是 JVM

public class TestThrows {
  public static void main(String[] args) throws InputMismatchException {
    Scanner sc = new Scanner(System.in);
    int num = sc.nextInt();
  }
}

当然,调用者也可以不进行这个异常的处理,继续扔给上一层(调用者的调用者)处理

throw

在执行某个方法的时候,可以随时抛出一个异常,如

public static void main(String[] args) {
  // blabla
  throw new MyException();
}

自定义异常

首先,Java 除了 POD,都是类。

通常情况下,自定义的异常,是 java.lang.Exception 的子类

Java 当中,类继承需要使用 extends 关键字

public class MyException extends Exception {
  public MyException() {
    super("message to display");
  }
}

其中,super() 是 Java 当中的一个关键字,用于调用父类的 constructor

assert

Java 的 assertion 与 C 当中的不同。Java 当中的语法是
assert <bool expr> : <msg>

若布尔表达式的值为 false,则抛出 java.lang.AssertionError,并显示信息

注意,若要启用 assert 的功能,必须给 JVM 提供 -ea 的选项